#ifndef DEFINES_H_
#define DEFINES_H_

#include <signal.h>
#include <string.h>
#include <string>

//Parametrizaciones por defecto del juego
const  short int VIDAS_POR_DEFECTO = 3;	//Cantidad de vidas por defecto de mario.
const int MSJ_LENGHT = 5;						//Tamaño por defecto del msj char a enviar en las acciones t_accion.
const std::string ARCH_CONFIG="archivoconfiguracion";//Donde se encuentra el archivo de configuracion.
const int MAX_PUERTO_SERVER = 65536;			//Maximo valor para el puerto del servidor.
const int MIN_PUERTO_SERVER = 10000;			//Minimo valor para el puerto del servidor.
const int CONST_CANT_VIDRIOS = 30;

/* Seniales enviadas */
const int SENIAL_FIN_DAEMON = SIGTERM;				//Senial que envia el daemon al servidor partida para finalizar la partida en emergencia.
const int SENIAL_FIN_TORNEO = SIGINT;				//Senial que envia el servidor de torneo al de partida para finalizar la partida .
const int SENIAL_FIN_PARTIDA= SIGUSR1;				//Senial que envia el Thread0 a sus threads para finalizar la partida.
const int SENIAL_FIN_TORNEO_ERROR = SIGUSR2;		//Senial que envia el servidor de torneo al de partida para finalizar la partida .

/* Parametros de dificultad */
const  short int MV_SIN_LANZ_IN 	=8;	//Cantidad para el primer nivel de movimientos de donkey sin lanzar en el nivel inicial.
const  short int CC_SIN_FUEGOS_IN   	=20;//Cantidad para el primer nivel de ciclos de animacion sin aparecer un fuego.
const  short int CN_BQH_QUITAR_IN  	=2; //Cantidad de bloqueos a quitar para el primer nivel por fila, para volver mas simple el juego.
const  short int CN_BQV_QUITAR_IN  	=2; //Cantidad de bloqueos a quitar para el primer nivel por columna, para volver mas simple el juego.
const  short int CC_SIN_TORTAS_IN	=30;//Cantidad para el primer nivel de ciclos de animacion sin aparecer una torta.
const  short int DEC_SIN_LANZ	 	=2;	//Por cada nivel la espera entre ladrillo y ladrillo decrementa 2, haciendolo mas frecuente.
const  short int DEC_SIN_FUEGOS   	=5;	//Por cada nivel la espera entre fuego y fuego decrementa 5 ciclos, haciendolo mas frecuente.
const  short int DEC_BQH_QUITAR  	=0; //Por cada nivel la espera entre torta y torta aumenta 3 ciclos, haciendolo menos frecuente.
const  short int DEC_BQV_QUITAR  	=1; //Cantidad de bloqueos a quitar para el primer nivel por columna, para volver mas simple el juego.
const  short int DEC_SIN_TORTAS		=3;//Por cada nivel la espera entre torta y torta aumenta 3 ciclos, haciendolo menos frecuente.

/* Cantidad de tramos por nivel */
const  short int CN_TRAMOS_LVL1     =3;	//Cantidad de tramos en el nivel 1 de la partida.
const  short int CN_TRAMOS_LVL2     =4;	//Cantidad de tramos en el nivel 2 de la partida.
const  short int CN_TRAMOS_LVL3     =4;	//Cantidad de tramos en el nivel 3 de la partida.

//Pantalla
const int ALTO_RESOLUCION=600;		//Pixeles=de=alto=del=screen.
const int ANCHO_RESOLUCION=800;		//Pixeles=de=ancho=del=screen.
const int LIM_SUP=190;				//Limite=superior=de=pixeles=para=objetos.
const int LIM_INF=419;				//Limite=inferior=de=pixeles=para=objetos.
const int LIM_IZQ=189;				//Limite=izquierdo=de=pixeles=para=objetos.
const int LIM_DER=LIM_IZQ + 332;	//Limite=derecho=de=pixeles=para=objetos.
const char CANT_COL_VENTANAS = 4;	//Cantidad de columnas de ventanas que hay en la pantalla;
const char CANT_FIL_VENTANAS = 2;	//Cantidad de filas de ventanas que hay en la pantalla;
const char CONST_CANT_VENTANAS = 15;//Cantidad de ventanas dentro del juego.

//											Movimientos											//
//Visto=en=pixeles
//Posiciones iniciales
const int POS_INI_X_MARIO1=228;		//Posicion=inicial=de=felix1=en=x.
const int POS_INI_Y_MARIO1=419;		//Posicion=inicial=de=felix1=en=y.
const int POS_INI_X_MARIO2=512;		//Posicion=inicial=de=felix2=en=x.
const int POS_INI_Y_MARIO2=419;		//Posicion=inicial=de=felix2=en=y.
const int POS_INI_X_DONKEY=228;		//Posicion=inicial=de=ralph=en=x.
const int POS_INI_Y_DONKEY=52;		//Posicion=inicial=de=ralph=en=y.
const int POS_INI_Y_FUEGO=410;		//Posicion base donde puede aparecer un fuego.
//Ancho en movimientos
const int ANCHO_MOV_X_FELIX=71;		//Cuantos=se=mueve=en=x=por=defecto=felix.
const int ANCHO_MOV_Y_FELIX=111;	//Cuantos=se=mueve=en=y=por=defecto=felix.
const int ANCHO_MOV_X_RALPH=71;		//Cuantos=se=mueve=en=x=por=defecto=ralph.
const int ANCHO_MOV_Y_FUEGO=105;		//Cuantos=se=mueve=en=y=por=defecto=objetos.
const int ANCHO_MOV_X_OBJ=30;		//Cuantos=se=mueve=en=x=por=defecto=objetos.
const int ANCHO_MOV_Y_OBJ=55;		//Cuantos=se=mueve=en=y=por=defecto=objetos.
//Visto=en=numero=de=vidrio=dentro=de=la=pantalla
const int ANCHO_MOV_VID_X_FEL=1;	//Cuantos=vidrios=se=mueve=en=x=por=defecto=felix.
const int ANCHO_MOV_VID_Y_FEL=10;	//Cuantos=vidrios=se=mueve=en=y=por=defecto=felix.

//									Ancho y alto de objeos										//
const int ANCHO_MARIO = 31;			//Cuanto mide de ancho felix para calcular colisiones
const int ALTO_MARIO = 83;			//Cuanto mide de alto felix para calcular colisiones
const int ANCHO_DONKEY = 91;			//Cuanto mide de ancho ralph para calcular lanzamiento de ladrillos.
const int ALTO_DONKEY = 109;			//Cuanto mide de alto ralph para calcular lanzamiento de ladrillos.
const int ANCHO_FUEGO = 43;			//Cuanto mide de ancho el fuego para calcular lanzamiento de ladrillos.
const int ALTO_FUEGO = 39;			//Cuanto mide de alto  el fuego para calcular lanzamiento de ladrillos.
const int ANCHO_MARTILLO = 23;			//Cuanto mide de ancho la torta para calcular colisiones.
const int ALTO_MARTILLO = 27;			//Cuanto mide de alto  la torta para calcular colisiones.
const int ANCHO_BARRIL = 25;		//Cuanto mide de ancho el ladrillo para calcular colisiones.
const int ALTO_BARRIL = 17;		//Cuanto mide de alto  el ladrillo para calcular colisiones.

//											Velocidades											//
const int SPEED_ANIM=300000;		//Lapso entre animacion de los objetos animados .
const int SPEED_REFRESH_RANK=500000;//Lapso entre refresco y refresco de la info brindada del servidor torneo hacia el partida por shm.

//										Numeros Bools o Strings									//
const int  CONST_CERO=0;			//Vale=0
const int  CONST_MENOS_UNO = -1;	//Vale=-1
const int  CONST_UNO=1;				//Vale==1
const int  CONST_TRES=3;			//Vale 3
const int  CONST_DOS=2;			//Vale 2
const int  CONST_CUATRO=4;			//Vale 4
const int  CONST_CINCO=5;			//Vale 5
const int  CONST_SEIS=6;			//Vale 6
const int  CONST_SIETE=7;			//Vale 7
const bool CONST_TRUE=true;			//Vale true
const bool CONST_FALSE=false;		//Vale false

//										IdElementos prestablecidos.								//
const int  CONST_ID_DONKEY  = 52;	//Id prestablecido de ralph.
const short int CONST_ID_MARIO1 = 53;	//Id prestablecido de felix1.
const  short int CONST_ID_MARIO2 = 54;	//Id prestablecido de felix2.
const int  CONST_ID_FUEGO    = 55;	//Id prestablecido del fuego.
const int  CONST_ID_MARTILLO  = 56;	//Id prestablecido de la torta.
const int  ID_BASE_BARRIL = 57;	//Id del primer ladrillo a crear, para crear los siguientes se offsetea hasta MAX_CANT_LADRILLOS-1.

//											Acciones											//
/* Incializaciones */
const  short int ACC_INIT_PARTIDA = 1;	//Inicia la partida creando los elementos básicos y indicando a los jugadores que numero de jugador son y el nombre del otro jugador
const  short int ACC_INIT_NIVEL = 2;	//Inicia el nivel ingresado por parametro, con la dificultad que le corresponda.
const  short int ACC_INIT_TRAMO = 3;	//Inicia el tramo sorteando los objetos con la semilla que se envia por parámetro.
const  short int ACC_ACT_PUNT = 4;		//Actualiza el puntaje del jugador enviado por id_Entidad
const  short int ACC_ACT_RANK = 5;		//Actualiza el ranking en el cliente para el jugador enviado en la accion.
const  short int ACC_COMENZAR = 6;

// TODO: Ver accion AAC_COMENZAR

const  short int ACC_MOVER=7;				//Accion=mover=un=elemento=del=juego
const  short int  ACC_REPARAR_XXXX=8;			//Se=usa=para=que=felix=repare=y=la=ventana=sea=reparada
const  short int  ACC_SALIR_JUEGO=9;		//Cuando=un=jugador=quiere=salir=del=juego,=envia=esta=accion.=y=es=eliminado=del=juego=partida=y=torneo.
const  short int  ACC_CREAR_MARTILLO=10;		//Crea=un=elemento=torta=dentro=del=juego,=enviando=el=numero=de=vidrio=al=cliente=donde=se=crea=la=torta,=eso=define=el=x,=y.
const  short int  ACC_DELETE_MARTILLO=11;		//Elimina=un=elemento=torta=dentro=del=juego,=enviando=el=numero=de=vidrio=al=cliente=donde=se=elimina=la=torta.
const  short int  ACC_CONSUMIR_TORTA=12;	//Accion que envia el servidor al jugador para avisar que felix es inmune.
const  short int  ACC_CREAR_FUEGO=13;			//Activa=el=elemento=fuego=dentro=del=juego=cambiando=el=estado=a=activo=en=el=servidor=y=enviando=el=numero=de=vidrio=al=cliente=donde=se=crea=la=torta.
const  short int  ACC_DELETE_FUEGO=14;		//Elimina=un=elemento=fuego=dentro=del=juego,=enviando=el=numero=de=vidrio=al=cliente=donde=se=elimina=la=torta.
const  short int  ACC_CREAR_BARRIL=15;	//Activa=un=ladrillo=dentro=del=juego,=cambiando=el=estado=en=el=servidor=y=enviandole=el=x,=y=donde=posicionarlo=en=la=pantalla=al=cliente.
const  short int  ACC_DELETE_BARRIL=16;	//Desaparece=un=elemento=de=la=pantalla.
const  short int  ACC_LANZAR_BARRIL=17;	//Desaparece=un=elemento=de=la=pantalla.
const  short int  ACC_RESTAR_VIDA=18;		//Se=le=quita=una=vida=al=jugador=enviado=en=la=acccion.
const  short int  ACC_MORIR=19;				//Se=da=cuando=un=jugador=pierde=las=3=vidas,=no=puede=seguir=jugando=esta=partida=pero=sigue=en=el=torneo.

/* Fin de tramo nivel o partida */
const  short int  ACC_FIN_TRAMO=20;			//Finaliza el tramo en juego.
const  short int  ACC_FIN_NIVEL=21;			//Finaliza el nivel en juego.
const  short int  ACC_FIN_PARTIDA=22;		//Se da cuando ambos jugadores pierden las 3 vidas, o salieron del juego.
const  short int  ACC_FIN_TORNEO=23;		//Finaliza el torneo

const  short int ACC_DONKEY_ESPERA=24;				//
const  short int ACC_DONKEY_TOMAR=25;				//
const  short int ACC_DONKEY_LANZAR=26;				//
const  short int ACC_DONKEY_SOSTENER=27;				//


//											Tipos=elementos												//
const char TIPO_ELEM_DONKEY='R';		//identifica=al=tipo=de=elemento=RALPH
const char TIPO_ELEM_MARIO='F';		//identifica=al=tipo=de=elemento=RALPH
const char TIPO_ELEM_FUEGO='A';		//identifica=al=tipo=de=elemento=FUEGO
const char TIPO_ELEM_BARRIL='L';	//identifica=al=tipo=de=elemento=LADRILLO
const char TIPO_ELEM_BLOQUEO='B';	//identifica=al=tipo=de=elemento=BLOQUWO
const char TIPO_ELEM_VIDRIO='V';	//identifica=al=tipo=de=elemento=VIDRIO
const char TIPO_ELEM_MARTILLO= 'T';	//identifica al tipo de elemento TORTA.

//											Estados de objetos											//
const char CANT_ESTADOS_VIDRIO = 2;		//Cantidad de estados de un vidrio.
const char ESTADO_VIDRIO_OK = 0;		//Identifica el estado ok de un vidrio, que no esta roto.
const char ESTADO_VIDRIO_ROTO = 1;		//Identifica el estado roto de un vidrio.
const char ESTADO_BLOQ_LOCK = 1;		//Identifica el estado bloqueado de un posible bloqueo.
const char ESTADO_BLOQ_FREE = 0;		//Identifica el estado libre de un posible bloqueo.

//										Constantes para sorteo de objetos								//
const char OFF_IDX_BLOQ_X_COL = 9;		//Define cuanto es el offset en indices entre un bloqueo vertical y superior de su misma columna.

const char MIN_IDX_VIDRIOS  = 0;		//Indice menor de los vidrios
const char MAX_IDX_VIDRIOS  = 29;		//Indice mayor de los vidrios

const char CANT_TIPOS_BLOQ = 2;			//Cantidad de tipos de bloqueos que se pueden dar, columnas o filas.
const char TIPO_BLOQ_HORIZ = 0;			//Resultado que indica que se van a realizar bloqueos por columnas.
const char TIPO_BLOQ_VERTI = 1;			//Resultado que indica que se van a realizar bloqueos por filas.

const char CANT_BLOQ_X_COL = 3;			//Cantidad de bloqueos verticales por columnas por tramo.
const char CANT_BLOQ_X_FIL = 5;			//Cantidad de bloqueos horizontales por fila por tramo.

const char MIN_IDX_BLOQUEOS = 30;		//Indice menor de los bloqueos
const char MAX_IDX_BLOQUEOS = 51;		//Indice mayor de los bloqueos

const char MIN_IDX_BLOQV_FILA1 = 34;	//Indice menor de los bloqueos verticales de la fila1
const char MAX_IDX_BLOQV_FILA1 = 38;	//Indice mayor de los bloqueos verticales de la fila1
const char MIN_IDX_BLOQV_FILA2 = 43;	//Indice menor de los bloqueos verticales de la fila2
const char MAX_IDX_BLOQV_FILA2 = 47;	//Indice mayor de los bloqueos verticales de la fila2

const char MIN_IDX_BLOQH_FILA1 = 30;	//Indice menor de los bloqueos horizontales de la fila1
const char MAX_IDX_BLOQH_FILA1 = 33;	//Indice mayor de los bloqueos horizontales de la fila1
const char MIN_IDX_BLOQH_FILA2 = 39;	//Indice menor de los bloqueos horizontales de la fila2
const char MAX_IDX_BLOQH_FILA2 = 42;	//Indice mayor de los bloqueos horizontales de la fila2
const char MIN_IDX_BLOQH_FILA3 = 48;	//Indice menor de los bloqueos horizontales de la fila3
const char MAX_IDX_BLOQH_FILA3 = 51;	//Indice mayor de los bloqueos horizontales de la fila3


//										Cantidad de elementos											//
const char MAX_CANT_BARRILES = 5;

//										Puntos por elemento												//
const int PTOS_CONS_TORTA = 10;		//Define cuantos puntos le suma a felix por consumir una torta.
const int PTOS_REP_VIDRIO = 10;		//Define cuantos puntos le suma a felix por reparar un vidrio.

#endif /*DEFINES_H_*/

